const map = new Map<string,any>();

// 缓存时长
const duration = 1000 * 60 * 5;

// 排除不需要缓存的接口
const excludesStarts = ["/login"]

// 不缓存，并且会清空命名空间缓存的方法
const excludeMethods = ["delete","update","insert"]

function load(key:string):any | null {
    const obj = map.get(key);
    if (null == obj) {
        return null;
    }
    // 如果时间为负数，那么表示永久存储
    if (duration < 0) {
        return obj.data;
    // 如果时间为0，表示不缓存
    } else if (duration == 0) {
        return null;
    } else {
        const now = new Date();
        if (now.getTime() - obj.time >= duration) {
            return null;
        }
        return obj.data;
    }
}

/**
 * 在本地缓存中存储数据，或清空缓存数据（执行增、删、改操作时）
 * @param {String} url 请求地址
 * @param {String} jsonData 请求参数的json字符串
 * @param {String} methodStr 请求方法
 * @param {Object} data 要缓存的数据
 * @returns undefined
 */
function save(url = "",jsonData:any,methodStr:string | undefined,data:any) {
    // 某些接口不需要缓存数据
    const flag1 = excludesStarts.some(v => url.startsWith(v));
    if (flag1) {
        return;
    }
    // 获取url地址中的方法，/admin/insert => /命名空间/方法 => 方法为insert
    const method = url.substring(url.indexOf("/",1) + 1);
    // update,delete,insert不需要缓存
    const flag2 = excludeMethods.some(v => method.startsWith(v));
    // 清空命名空间中的缓存数据
    if (flag2) {
        // 获取url地址中的命名空间 /admin/insert => /admin/
        const starts = url.substring(0,url.indexOf("/",1) + 1);
        Array.from(map.keys()).forEach(v => {
            if (v.startsWith(starts)) {
                map.delete(v);
            }
        })
        return;
    }
    const key = url + jsonData + methodStr;
    console.log("key = ",key);
    const time = new Date().getTime();
    map.set(key,{
        time,
        data
    });
}


/**
 * 清空所有缓存数据
 */
 function clearAll() {
    console.log("清空所有缓存！");
    map.clear();
}

export {load,save,clearAll}